package ch.utilities;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ch.exception.BadMessageFormatException;

/** Classe per il parsing di un messaggio email.
*
* @author Neil Otupacca - May 21 2011
*
*/
public class RFC822Parser {

	private String message;

	public RFC822Parser(String message) {
		this.message = message;
	}

	/** Ritorna l'intero set degli headers del messaggio.
	 *
	 * @return headers.
	 */
	public String getHeaders() {
		String re = "^(.+?)(?:\r\n?+|\n\r?+){2}";
		Pattern pat = Pattern.compile(re, Pattern.DOTALL);
		Matcher matcher = pat.matcher(message);

		// Errore di formato
		if (!matcher.find()) throw new BadMessageFormatException();

		return(matcher.group(1));
	}

	/** Ritorna il <i>body</i> del messaggio.
	 *
	 * @return body.
	 */
	public String getBody() {
		String re = "^.+?(?:\r\n?+|\n\r?+){2}\\s*(.+?)\\s*$";
		Pattern pat = Pattern.compile(re, Pattern.DOTALL);
		Matcher matcher = pat.matcher(message);

		// Errore di formato
		if (!matcher.find()) throw new BadMessageFormatException();

		return(matcher.group(1));
	}

	/** Ritorna il mittente del messaggio.
	 *
	 * @return mittente.
	 */
	public String getSender() {
		return(getHeaderField("From"));
	}

	/** Ritorna il subject del messaggio.
	 *
	 * @return subject.
	 */
	public String getSubject() {
		return(getHeaderField("Subject"));
	}

	/** Ritorna la data del messaggio.
	 *
	 * @return data.
	 */
	public String getDate() {
		return(getHeaderField("Date"));
	}

	/** Ritorna l'header con nome <b>field</b>.
	 *
	 * @param field - nome dell'header.
	 * @return header.
	 */
	public String getHeaderField(String field) {
		String re = "^" + field + ":[ \\t]*(.*?)\\s*?(?=(?:[\\n\\r]+\\S|\\Z))";
		Pattern pat = Pattern.compile(re, Pattern.MULTILINE | Pattern.DOTALL);
		Matcher matcher = pat.matcher(getHeaders());

		// Errore di formato
		if (!matcher.find()) return("");

		return(matcher.group(1));
	}
}
